# -*- coding: utf-8 -*-
"""Moniperintäesimerkki
import minheritance

pv = minheritance.Polkuvene()
p = minheritance.Polkija(4)
p.aja(pv, "etelä", 40)
"""

class Ajaja:
    def aja(self, ajoneuvo, suuntaan, nopeudella):
        self.ajoneuvo = ajoneuvo
        ajoneuvo.ajaja = self
        ajoneuvo.ohjaa(suuntaan)
        ajoneuvo.kiihdyta(nopeudella)

    def vaihdaSuuntaa(self, suunta):
        self.ajoneuvo.ohjaa(suunta)

    def muutaNopeutta(self, nopeus):
        if nopeus < 0:
            raise Exception, 'Nopeus ei voi olla 0 pienempi.'
        if nopeus is self.ajoneuvo.nopeus:
            "Nopeus on jo " + str(nopeus)
        elif nopeus > self.ajoneuvo.nopeus:
            self.ajoneuvo.kiihdyta(nopeus-self.ajoneuvo.nopeus)
        else:
            self.ajoneuvo.jarruta(self.ajoneuvo.nopeus-nopeus)

class Polkija(Ajaja):
    def __init__(self, polkuvoima):
        if polkuvoima < 0:
            polkuvoima = 1
        self.polkuvoima = polkuvoima

    def polkaisePoljinta(self, poljin):
        """Polkaisee annettua poljinta polkijan polkuvoimalla"""
        return poljin.polje(self.polkuvoima)

class Ajoneuvo:
    """Ajoneuvo"""
    def __init__(self):
        self.ajaja = None
        self.nopeus = None
        self.suunta = None
        self.nopeus = 0

    def ohjaa(self, suunta):
        print "Muutettiin suuntaa suuntaan: " + str(suunta)

    def kiihdyta(self, nopeudenLisays):
        """Kiihdyttaa nopeuden lisäyksen verran nopeutta"""
        if nopeudenLisays < 0:
            nopeudenLisays = 0
        self.nopeus += nopeudenLisays
        print "Kiihdytetään nopeuteen " + str(self.nopeus)
        return self.nopeus

    def jarruta(self, nopeudenVahennys):
        if nopeudenVahennys < 0:
            nopeudenVahennys = 0
        self.nopeus -= nopeudenVahennys
        print "Jarrutetaan nopeuteen " + str(self.nopeus)
        return self.nopeus

class Poljin:
    def polje(self, voima):
        """Paulauttaa voiman vaikutuksen nopeuteen"""
        print "Poljinta polkaistu voimalla " + \
               str(voima) + \
               "."
        return (voima/100)+1 

class Polkuajoneuvo(Ajoneuvo):
    """Polkuajoneuvo"""
    def __init__(self, polkimienMaara):
        Ajoneuvo.__init__(self)
        #Luodaan polkimet
        self.polkimet = []
        for i in range(polkimienMaara):
            self.polkimet.append(Poljin())

    def kiihdyta(self, nopeudenLisays):
        vanhaNopeus = self.nopeus
        nopeus = self.nopeus + nopeudenLisays
        while vanhaNopeus < nopeus:
            print "Poljetaan kunnes " + str(vanhaNopeus) +  " nopeudessa " + str(self.nopeus) + ". Ero on " + str(nopeus-vanhaNopeus) + "."
            for poljin in self.polkimet:
                vanhaNopeus += self.ajaja.polkaisePoljinta(poljin)
        Ajoneuvo.kiihdyta(self, nopeudenLisays)

class Vesiajoneuvo(Ajoneuvo):
    """Vesiajoneuvo
    tiheys esitetään g/m^3 yksiköissä"""
    def __init__(self, tiheys):
        Ajoneuvo.__init__(self)
        if tiheys > 1:
            raise Exception, 'Tiheyden tulee olla pienempi kuin veden (1,000g/m^3)'
        self.tiheys = tiheys

class Polkuvene(Polkuajoneuvo, Vesiajoneuvo):
    """Polkuvene"""
    def __init__(self, tiheys=0.97, poljintenMaara=2):
        Vesiajoneuvo.__init__(self,tiheys)
        Polkuajoneuvo.__init__(self,poljintenMaara)

    def kiihdyta(self, nopeudenLisays):
        Polkuajoneuvo.kiihdyta(self, nopeudenLisays)
